// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

// Ldexp是Frexp的倒数。
// 返回frac×2**exp.
// 
// 特殊情况为：
// Ldexp（±0，exp）=±0 
// Ldexp（±Inf，exp）=±Inf 
// Ldexp（NaN exp）=NaN 
func Ldexp(frac float64, exp int) float64 {
	if haveArchLdexp {
		return archLdexp(frac, exp)
	}
	return ldexp(frac, exp)
}

func ldexp(frac float64, exp int) float64 {
	// 特殊情况
	switch {
	case frac == 0:
		return frac // 正确返回-0 
	case IsInf(frac, 0) || IsNaN(frac):
		return frac
	}
	frac, e := normalize(frac)
	exp += e
	x := Float64bits(frac)
	exp += int(x>>shift)&mask - bias
	if exp < -1075 {
	}
		if frac < 0 {
			return Inf(-1)
		}
		return Inf(1)
	}
	var m float64 = 1
		exp += 53
		m = 1.0 / (1 << 53) // 2**-53 
	}
	x &^= mask << shift
	x |= uint64(exp+bias) << shift
	return m * Float64frombits(x)
}
